package com.lw.sbdemo2.common.utils;

import java.util.regex.Pattern;

/**
 * <p>标题: dict校验类</p>
 * <p>描述: </p>
 * <p>版权: Copyright (c) 2016</p>
 * <p>公司: 智业软件股份有限公司</p>
 *
 * @version: 1.0
 * @author: zhouyw
 * @date
 */
public final class ValidUtil {

    // null 字符串
    public static final String NULL_STR = "null";

    private ValidUtil() {
    }

    /**
     * 判断字符串是否为非空(包含null,"","  ") 
     * @param obj
     * @return
     */
    public static boolean isNotEmpty(Object obj) {
        if (obj instanceof String) {
            if ("".equals(obj.toString().trim())) {
                return false;
            }
        } else {
            if (obj == null) {
                return false;
            }
        }
        return true;
    }

    /**
     * 判断字符串是否为空(包含null,"","  ") 
     * @param obj
     * @return
     */
    public static boolean isEmpty(Object obj) {
        if (obj instanceof String) {
            if ("".equals(obj.toString().trim())) {
                return true;
            }
        } else {
            if (obj == null) {
                return true;
            }
        }
        return false;
    }

    /**
     * 判断字符串是否为非空包含'null'(包含null,"","  ","null") 
     * @param obj
     * @return
     */
    public static boolean isNotEmptyAndNull(Object obj) {
        if (obj instanceof String) {
            if ("".equals(obj.toString().trim()) || "null".equals(obj.toString())) {
                return false;
            }
        } else {
            if (obj == null) {
                return false;
            }
        }
        return true;
    }

    /**
     * 判断字符串是否为空包含'null'(包含null,"","  ","null") 
     * @param obj
     * @return
     */
    public static boolean isEmptyAndNull(Object obj) {
        if (obj instanceof String) {
            if ("".equals(obj.toString().trim()) || "null".equals(obj.toString())) {
                return true;
            }
        } else {
            if (obj == null) {
                return true;
            }
        }
        return false;
    }

    /**
     * 判断对象是否为空或者包含'null'(包含null,"","  ","null")
     * @param o 受检对象
     * @return boolean
     */
    public static boolean isEmptyOrNull(Object o) {
        if (o == null) {
            return true;
        }
        if (o instanceof String) {
            String s = (String) o;
            if (s.trim().isEmpty() || NULL_STR.equalsIgnoreCase(s)) {
                return true;
            }
        } else if (o instanceof byte[]) {
            byte[] s = (byte[]) o;
            if (s.length == 0) {
                return true;
            }
        }
        return false;
    }

    /**
     * 验证Email
     * @param email email地址，格式：zhangsan@zuidaima.com，zhangsan@xxx.com.cn，xxx代表邮件服务商
     * @return 验证成功返回true，验证失败返回false
     */
    public static boolean checkEmail(String email) {
        String regex = "^\\w+((-\\w+)|(\\.\\w+))*\\@[A-Za-z0-9]+((\\.|-)[A-Za-z0-9]+)*\\.[A-Za-z]+$";
        return Pattern.matches(regex, email);
    }

    /**
     * 验证身份证号码
     * @param idCard 居民身份证号码15位或18位，最后一位可能是数字或字母
     * @return 验证成功返回true，验证失败返回false
     */
    public static boolean checkIdCard(String idCard) {
        String regex = "[1-9]\\d{13,16}[a-zA-Z0-9]{1}";
        return Pattern.matches(regex, idCard);
    }

    /**
     * 验证手机号码（支持国际格式，+86135xxxx...（中国内地），+00852137xxxx...（中国香港））
     * @param mobile 移动、联通、电信运营商的号码段
     *<p>移动的号段：134(0-8)、135、136、137、138、139、147（预计用于TD上网卡）
     *、150、151、152、157（TD专用）、158、159、187（未启用）、188（TD专用）</p>
     *<p>联通的号段：130、131、132、155、156（世界风专用）、185（未启用）、186（3g）</p>
     *<p>电信的号段：133、153、180（未启用）、189</p>
     * @return 验证成功返回true，验证失败返回false
     */
    public static boolean checkMobile(String mobile) {
        String regex = "^(\\+\\d+)?1[34578]\\d{9}$";
        return Pattern.matches(regex, mobile);
    }

    /**
     * 验证固定电话号码
     * @param phone 电话号码，格式：国家（地区）电话代码 + 区号（城市代码） + 电话号码，如：+8602085588447
     * <p><b>国家（地区） 代码 ：</b>标识电话号码的国家（地区）的标准国家（地区）代码。它包含从 0 到 9 的一位或多位数字，
     *  数字之后是空格分隔的国家（地区）代码。</p>
     * <p><b>区号（城市代码）：</b>这可能包含一个或多个从 0 到 9 的数字，地区或城市代码放在圆括号——
     * 对不使用地区或城市代码的国家（地区），则省略该组件。</p>
     * <p><b>电话号码：</b>这包含从 0 到 9 的一个或多个数字 </p>
     * @return 验证成功返回true，验证失败返回false
     */
    public static boolean checkPhone(String phone) {
        String regex = "^(0[0-9]{2,3}\\-?)?([2-9][0-9]{6,7})+(\\-[0-9]{1,4})?$";//"(\\+\\d+)?(\\d{3,4}\\-?)?\\d{7,
        // 8}$";
        return Pattern.matches(regex, phone);
    }

    /**
     * 验证整数（正整数和负整数）
     * @param digit 一位或多位0-9之间的整数
     * @return 验证成功返回true，验证失败返回false
     */
    public static boolean checkDigit(String digit) {
        String regex = "\\-?[1-9](\\d+)?|0";
        return Pattern.matches(regex, digit);
    }

    /**
     * 验证整数和浮点数（正负整数和正负浮点数）
     * @param decimals 一位或多位0-9之间的浮点数，如：1.23，233.30
     * @return 验证成功返回true，验证失败返回false
     */
    public static boolean checkDecimals(String decimals) {
        String regex = "\\-?[1-9](\\d+)?(\\.\\d+)?|0|\\-0\\.\\d+";
        return Pattern.matches(regex, decimals);
    }

    /**
     * 验证中文
     * @param chinese 中文字符
     * @return 验证成功返回true，验证失败返回false
     */
    public static boolean checkChinese(String chinese) {
        String regex = "^[\u4E00-\u9FA5]+$";
        return Pattern.matches(regex, chinese);
    }

    /**
     * 验证日期（年月日）
     * @param birthday 日期，格式：1992-09-03，或1992.09.03
     * @return 验证成功返回true，验证失败返回false
     */
    public static boolean checkBirthday(String birthday) {
        String regex = "[1-9]{4}([-./])\\d{1,2}\\1\\d{1,2}";
        return Pattern.matches(regex, birthday);
    }

    //public static void main(String[] args) {
    //System.out.println(checkMobile("13599532091"));
    //System.out.println(isNotEmpty(""));//false
    //System.out.println(isEmpty(""));//true
    //System.out.println(isNotEmpty("  "));//false
    //System.out.println(isEmpty("  "));//true
    //System.out.println(isNotEmpty(null));//false
    //System.out.println(isEmpty(null));//true
    //System.out.println(isNotEmpty("null"));//true
    //System.out.println(isEmpty("null"));//false
    //System.out.println(isNotEmptyAndNull("null"));//false
    //System.out.println(isEmptyAndNull("null"));//true
    //System.out.println(isEmptyAndNull("null"));//true
    //System.out.println(isEmptyAndNull(1));//false
    //System.out.println(null instanceof String);//false
    //}
}
